#pragma once

#include "rend_Color.h"
#include "utils_Rect.h"
#include "rend_Blend.h"
#include "rend_Texture.h"

//! (Animowany) sprajt.

class Sprite
{
public:
	//! Nic nie robi.
	virtual				~Sprite() {}
	//! Klatki animacji.
	std::vector<Rect>	frames;
	//! Zmienia klatki animacji.
	virtual bool		animate(const u32 &elapsed_ms) = 0;
	//! Rysuje sie.
	virtual void		draw(const float &x, const float &y, f32 w=0, f32 h=0, const float &angle = 0) = 0;
	//! Rysuje sie "odbity".
	virtual void		draw_mirrored(bool mv, bool mh, const float &x, const float &y, f32 w=0, f32 h=0, const float &angle = 0) = 0;

	//! Ustawia liczbe milisekund miedzy klatkami animacji.
	virtual void		set_frame_delay(const u32 &frame_delay) = 0;
	//! Ustawia blending.
	virtual void		set_blend(const Blend &blend) = 0;
	//! Ustawia prostokat zrodlowy.
	virtual void		set_source_rect(const Rect &rect) = 0;
	//! Ustawia kolor. @b UWAGA: najlepiej po skorzystaniu ustawic z powrotem na 255,255,255,255.
	virtual void		set_color(const Color &color) = 0;
	//! Ustawia kotwice, wzgledem ktorej sprajt jest rysowany/obracany. @b UWAGA: po skorzystaniu zmienic na 0,0. 
	virtual void		set_hot_spot(const pos2 &hot_spot) = 0;
	//! Ustawia teksture.
	virtual void		set_texture(const Texture &texture) = 0;

	//! Zwraca liczbe milisekund miedzy klatkami animacji.
	virtual u32			get_frame_delay() = 0;
	//! Zwraca blending.
	virtual Blend		get_blend() = 0;
	//! Zwraca prostokat.
	virtual Rect		get_source_rect() = 0;
	//! Zwraca kolor.
	virtual Color		get_color() = 0;
	//! Zwraca kotwice.
	virtual pos2		get_hot_spot() = 0;
	//! Zwraca teksture.
	virtual Texture		get_texture() = 0;
};

typedef boost::shared_ptr<Sprite> SpritePtr;